package com.gton.person.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gton.person.commons.PageResult;
import com.gton.person.commons.ResultAdvice;
import com.gton.person.commons.excep.DIYException;
import com.gton.person.entity.ActivityAnditems;
import com.gton.person.entity.StudentActivity;
import com.gton.person.entity.StudentActivityItems;
import com.gton.person.entity.StudentUserInfo;
import com.gton.person.mapper.StudentActivityItemsMapper;
import com.gton.person.mapper.StudentActivityMapper;
import com.gton.person.mapper.StudentUserInfoMapper;
import com.gton.person.service.StudentActivityService;
import com.gton.person.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 服务实现类
 *
 * @author GuoTong
 * @since 2020-12-24
 */
@Service
public class StudentActivityServiceImpl extends ServiceImpl<StudentActivityMapper, StudentActivity> implements StudentActivityService {
    /**
     * 注入ActivityMapper
     */
    @Resource
    private StudentActivityMapper studentActivityMapper;

    /**
     * 注入ActivityItemsMapper
     */
    @Resource
    private StudentActivityItemsMapper studentActivityItemsMapper;

    /**
     * 注入用户表的Mapper
     */
    @Resource
    private StudentUserInfoMapper studentUserInfoMapper;

    /**
     * REdis  操作
     */
    @Autowired
    private StudentService studentService;

    /**
     * 创建活动，数据落地：
     * 活动关联两张表：
     * 活动表，   StudentActivity类
     * 活动项表    StudentActivityItems类
     * 表与表之间的关系，数据库不设置，数据库解耦，用java后台控制：   关系为：    1 -> n
     * 表与表之间的实体类解耦，不采用内嵌集合作为属性，保存子对象集合，采用封装的方式，新建一个封装类
     * CML 操作，还是多步操作，加入声明式事物控制
     *
     * @return boolean
     */
    @Override
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public boolean saveActivityAndItems(ActivityAnditems activityAnditems) {
        //第一步：获取活动对象字段
        StudentActivity studentActivity = activityAnditems.getStudentActivity();
        //如果没有收到活动表的数据，那么就直接创建失败
        if (StringUtils.isEmpty(studentActivity)) {
            return false;
        }
        //第二步：执行数据库保存操作
        try {
            int insert = studentActivityMapper.insert(studentActivity);
            //如果活动表数据库插入成功就插入活动项表
            if (insert > 0) {
                //活动对象，插入后会把主键id自动赋给StudentActivity对象
                //第三步：拿到studentActivity的主键::目的是活动项表需要这个主键
                String studentActivityId = studentActivity.getId();
                //第四步：获取活动项的数据 StudentActivityItems 是一个集合
                List<StudentActivityItems> list = activityAnditems.getList();
                //第五步：组装活动项表的数据：把活动表的ID set进去
                //第六步：组装活动项表数据完成，就执行写入数据库操作，选择mybatis-plus的批量插入，还是自己写循环遍历插入。
                //发现问题：mybatis-plus的批量插入是卸载Service内置方法，我们自定义写Service的话，就用不了
                for (StudentActivityItems activityItems : list) {
                    activityItems.setActivityId(studentActivityId);
                    activityItems.setCount(0);
                    int insert1 = studentActivityItemsMapper.insert(activityItems);
                    if (insert1 < 1) {
                        throw new DIYException(500, "活动项插入失败");
                    }
                }

            } else {
                throw new DIYException(500, "活动项插入失败");
            }
        } catch (DIYException e) {
            e.printStackTrace();
            throw new DIYException(500, "活动项插入失败");
        }
        return true;
    }

    /**
     * 活动大厅查询方法
     */
    @Override
    public PageResult selectByLimitAndKeyWords(Object page, Object pSize, Map<String, Object> map) {
        //防止有人恶意传入非法的分页参数，引起服务器代码运行报错
        Integer pageNumber = null;
        Integer pageSize = null;
        try {
            pageNumber = Integer.parseInt(page.toString());
            pageSize = Integer.parseInt(pSize.toString());
        } catch (NumberFormatException e) {
            e.printStackTrace();
            pageNumber = 0;
            pageSize = 10;
        }
        //组装分页条件
        Page<StudentActivity> page1 = new Page<>(pageNumber, pageSize);

        //组装条件筛选器
        QueryWrapper wrapper = new QueryWrapper();
        //判断是否传入额外查询条件
        if (map != null) {
            //判断是否传入了ID字段
            Object activityId = map.get("ActivityId");
            if (!StringUtils.isEmpty(activityId)) {

            }

            //判断是否传入了activityName字段
            Object activityName = map.get("activityName");
            if (!StringUtils.isEmpty(activityName)) {

            }

            //判断是否传入了startTime字段
            Object startTime = map.get("startTime");
            if (!StringUtils.isEmpty(startTime)) {

            }

            //判断是否传入了endTime字段
            Object endTime = map.get("endTime");
            if (!StringUtils.isEmpty(endTime)) {

            }
        }
        //执行查询
        Page<StudentActivity> userPage = studentActivityMapper.selectPage(page1, null);
        //获取数据||查找的记录
        List<StudentActivity> records = userPage.getRecords();

        //查询的发起人ID不能是编号，得是真实的名字，所以拿到编号去查询数据库替换
        for (StudentActivity activity : records) {
            //拿到用户编号
            String userId = activity.getOpenUserId();
            //去用户表查询数据
            //查询数据库
            //StudentUserInfo studentUserInfo = studentUserInfoMapper.selectById(userId);
            //查询Redis
            Map<String, Object> redisUserMapById = studentService.getRedisUserMapById(userId);
            //把查询的结果替换数据
            if (!StringUtils.isEmpty(redisUserMapById.get("useName"))) {
                activity.setOpenUserId(redisUserMapById.get("useName").toString());
            }
            //查询该活动的状态
            LocalDateTime endTime = activity.getEndTime();
            //获取当前时间
            LocalDateTime nowTime = LocalDateTime.now();

            //现在的时间 比 设定的时间   在之后
            if (nowTime.isAfter(endTime)) {
                //设置活动是进行中
                activity.setIsShow(1);
            } else {
                //设置活动已经过时
                activity.setIsShow(0);
            }

        }
        //获取总条数
        long total = userPage.getTotal();
        //类型转化
        Integer pageCount = Math.toIntExact(total);
        //最大页数
        int MaxPage = pageCount / pageSize + 1;
        //封装返回数据类型
        PageResult<Object> objectPageResult = new PageResult<>();

        objectPageResult.setData(records);
        objectPageResult.setPageCount(pageCount);
        objectPageResult.setCode("200");
        objectPageResult.setCurrentPage(pageNumber);
        objectPageResult.setMaxPage(MaxPage);
        objectPageResult.setPageSize(pageSize);
        return objectPageResult;
    }

}
